package cn.itcast.web.shiro;

import cn.itcast.common.utils.Encrypt;
import cn.itcast.web.token.FaceToken;
import cn.itcast.web.token.WxToken;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.authc.credential.SimpleCredentialsMatcher;

/**
 * 自定义密码比较器
 * 1、继承父类 SimpleCredentialsMatcher
 * 2、重写doCredentialsMatch方法（密码加密比较）
 * * 英文
 * Credentials ： 密码
 * Principal：安全数据（用户对象）
 */
public class CustomCredentialsMatcher extends SimpleCredentialsMatcher {

    /**
     * 密码比较方法
     * 参数：
     * token ： 用户登录输入的用户名（邮箱）和密码
     * info：realm域认证的返回值（用户对象，数据库密码，域名称）
     * 返回值boolean：
     * true：登录输入密码和数据库密码一致
     * flase：不一致，自动的抛出异常
     */
    public boolean doCredentialsMatch(AuthenticationToken token, AuthenticationInfo info) {
        if(token instanceof FaceToken || token instanceof WxToken){
            return true;
        }
        //1.获取输入的用户名（邮箱）密码
        UsernamePasswordToken upToken = (UsernamePasswordToken) token;
        String email = upToken.getUsername();
        String password = new String(upToken.getPassword());
        //2.获取数据库中的密码
        String dbPassword = (String) info.getCredentials();
        //3.对用户登录输入的密码加密
        password = Encrypt.md5(password, email);
        //4.比较
        return dbPassword.equals(password);

    }
}
